React์ ์คํ์ ์ธ Offscreen ๋ ๋๋ฌ๋ฅผ ๋ฐ๊ฒฌํ์ธ์. ์ด ํ์ ์ ์ธ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง ์์ง์ ์ ์ญ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ UI ๋ฐ์์ฑ๊ณผ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
React์ ๋ณด์ด์ง ์๋ ๊ฐ์: experimental_Offscreen ๋ ๋๋ฌ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง์ ์ดํดํ๋ค
ํ๋ ์น ๊ฐ๋ฐ์ ์ญ๋์ ์ธ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์
๋ฐ์์ฑ์ ๋ํ ์ฌ์ฉ์ ๊ธฐ๋์น๋ ๋์์์ด ๋์์ง๊ณ ์์ต๋๋ค. ๋งค์ผ ์๋ฐฑ๋ง ๊ฑด์ ํธ๋์ญ์
์ ์ฒ๋ฆฌํ๋ ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ๋ถํฐ ๋ค์ํ ์ ๋ฌธ ์ปค๋ฎค๋ํฐ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ ๊ตํ ๋ฐ์ดํฐ ์๊ฐํ ๋์๋ณด๋์ ์ด๋ฅด๊ธฐ๊น์ง, ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ๊ณผ ์ ๋์ ์ธ ์ํธ์์ฉ์ ๋ํ ์๊ตฌ๋ ์ฌ์ ํ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ํ๋ฐํธ์๋ ๊ฐ๋ฐ์ ์ด์์ธ React๋ ์ด๋ฌํ ๋์ ์ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๋ฉฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ฑ๋ฅ์ ํ๊ณ๋ฅผ ๋ฐ์ด๋๊ณ ์์ต๋๋ค. ๊ทธ์ค ๊ฐ์ฅ ์ผ์ฌ ์ฐฌ ์๋ ์ค ํ๋๋ ๋ฐ๋ก experimental_Offscreen ๋ ๋๋ฌ์
๋๋ค. ์ด๋ ๊ฐ๋ ฅํ์ง๋ง ์ข
์ข
์คํด๋ฐ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง ์์ง์ผ๋ก, ๊ณ ์ฑ๋ฅ์ ์ง์ ์ผ๋ก ๋งค๋๋ฌ์ด ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐฉ์์ ์ฌ์ ์ํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
์ด ํฌ๊ด์ ์ธ ํ๊ตฌ๋ React์ experimental_Offscreen์ ํต์ฌ ๋ฉ์ปค๋์ฆ, ์ฌ์คํ ์ด์ ๋ฐ ์ค์ ์ ์ฉ์ ๋ํด ์์ธํ ๋ค๋ฃน๋๋ค. ์ฐ๋ฆฌ๋ React์ ๋์์ฑ ์ํคํ
์ฒ ๋ด์์ ์ด ๋ ๋๋ฌ์ ์์น๋ฅผ ํ์
ํ๊ณ , ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ ๊ฑธ์ณ `experimental_Offscreen`์ ํ์ ์ ์ธ ์ ์ฌ๋ ฅ์ ๊ฒํ ํ๋ฉฐ, ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ๊ทธ ํ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด ๊ณ ๋ คํด์ผ ํ ์ฌํญ๋ค์ ๋
ผ์ํ ๊ฒ์
๋๋ค. React๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ก ์๋ ์์ค์ผ๋ก ๋์ด์ฌ๋ฆด ์ค๋น๊ฐ ๋ ๋ณด์ด์ง ์๋ ๊ฐ์๋ฅผ ์กฐ์ฉํ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๊ฒฌํ ์ค๋น๋ฅผ ํ์ธ์.
๋๋ฅ์ ๋๋๋๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ํ๊ตฌ
ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ๋ ๋ณต์กํด์ง๊ณ ์์ผ๋ฉฐ, ์ข ์ข ์ ๊ตํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค, ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋, ์ ๊ตํ ์ ๋๋ฉ์ด์ ๋ฐ ๋ค๋ฉด์ ์ธ ์ฌ์ฉ์ ํ๋ฆ์ ํน์ง์ผ๋ก ํฉ๋๋ค. ์ผ๊ด๋๊ฒ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ฉด์ ์ด๋ฌํ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ ์๋นํ ๋์ ๊ณผ์ ์ ๋๋ค. ๋ชจ๋ UI ์ ๋ฐ์ดํธ๊ฐ ๋ฉ์ธ ์ค๋ ๋์์ ๋ฐ์ํ๋ ์ ํต์ ์ธ ๋ ๋๋ง ๋ชจ๋ธ์ ์ข ์ข "๋ฒ๋ฒ ๊ฑฐ๋ฆผ(jank)"์ผ๋ก ์๋ ค์ง ํ์, ์ฆ ๋ฐ์์ฑ์ ๋ํ ์ฌ์ฉ์ ์ธ์์ ๋ฐฉํดํ๋ ์๊ฐ์ ๋๊น, ์ง์ฐ ๋๋ ๋ฉ์ถค์ ์ด๋ํฉ๋๋ค.
๋ฒํํ ๋์ฌ์ ์ฌ์ฉ์๊ฐ ๋คํธ์ํฌ ์ํ๊ฐ ๋ถ์์ ํ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๋ ์ํฉ์ ์์ํด ๋ณด์ญ์์ค. ๋ค๋ฅธ ๋ถ์ ์ฐจํธ ์ฌ์ด๋ฅผ ํ์ํ ๋ ๋์ ๋๋ ์ง์ฐ์ด๋ ์๊ฐ์ ์ธ ๋น ํ๋ฉด์ด ๋ฐ์ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ฌ์ฉ์ ์ ๋ขฐ๋ ๋จ์ด์ง๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์๊ฒฉ ์คํ๋์ค์์ ์ ๊ตํ ์น ๊ธฐ๋ฐ ๋๊ตฌ๋ก ํ์ ํ๋ ๋์์ด๋์ ๊ฒฝ์ฐ, ํญ ์ ํ ์ค ์ง์ฐ๋ ์ํธ์์ฉ์ด๋ ์ํ ์์ค์ ์์ฐ์ฑ์ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒ๋ค์ ๊ณ ๋ฆฝ๋ ์ฌ๊ฑด์ด ์๋๋ผ React๊ฐ ๋์์์ด ์ํํ๊ธฐ ์ํด ๋ ธ๋ ฅํด ์จ ๋ณดํธ์ ์ธ ๊ณ ํต ์ง์ ์ ๋๋ค.
React์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ํฅํ ์ฌ์ ์ ๋ช ๊ฐ์ง ์ค์ํ ํ์ ์ผ๋ก ํน์ง์ง์ด์ง๋๋ค.
- ์กฐ์ (Reconciliation) ๋ฐ ๊ฐ์ DOM: ์ง์ ์ ์ธ DOM ์กฐ์์ ์ค์ธ ์ด๊ธฐ ๋์ฝ.
- ํ์ด๋ฒ ์ํคํ ์ฒ(Fiber Architecture): ์ค๋จ ๋ฐ ์ฐ์ ์์ ์ง์ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํต์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ทผ๋ณธ์ ์ธ ์ฌ์์ฑ.
- ๋์์ฑ ๋ชจ๋(Concurrent Mode)(ํ์ฌ 'Concurrent React'): React๊ฐ ์ฌ๋ฌ ์์ ์ ๋์์ ์ํํ๊ณ , ํ์์ ๋ฐ๋ผ ๋ ๋๋ง์ ์ผ์ ์ค์งํ๊ณ ๋ค์ ์์ํ์ฌ UI ๋ฐ์์ฑ์ ์ ์งํ ์ ์๋๋ก ํ๋ ํจ๋ฌ๋ค์ ๋ณํ.
experimental_Offscreen ๋ ๋๋ฌ๋ ์ด๋ฌํ ๊ณ๋ณด ๋ด์์ ์์ฐ์ค๋ฌ์ฐ๋ฉด์๋ ํ๋ช
์ ์ธ ์งํ์
๋๋ค. ์ด๋ UI์ ์ผ๋ถ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ค๋นํ๊ณ ์ ์งํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํจ์ผ๋ก์จ Concurrent React์ ์ฒ ํ์ ํ์ฅํ์ฌ, ํ์ํ ๋ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ต์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์กฐ์ฐจ๋ ๊ดด๋กญํ๋ ์ธ์ง๋ ๋ก๋ฉ ์๊ฐ์ ์ ๊ฑฐํฉ๋๋ค.
React์ experimental_Offscreen ๋ ๋๋ฌ ์ดํดํ๊ธฐ
๋ณธ์ง์ ์ผ๋ก experimental_Offscreen์ ์ฌ์ฉ์๊ฐ ํ์ฌ ๋ณผ ์ ์๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ React๊ฐ ๋ ๋๋งํ๊ณ ์ ์งํ ์ ์๋๋ก ํ๋ ์ ๊ตํ ๋ฉ์ปค๋์ฆ์
๋๋ค. ์ด ๊ฐ๋
์ ๋จ์ํ ์์๋ฅผ ์จ๊ธฐ๋ display: none๊ณผ ๊ฐ์ ๊ฐ๋จํ CSS ํธ๋ฆญ์ ๋์ด์ญ๋๋ค. display: none์ ์์๋ฅผ ์จ๊ธฐ์ง๋ง React ๊ตฌ์ฑ ์์ ํธ๋ฆฌ์ ์ํ๋ฅผ ์ข
์ข
๋ฒ๋ ค, ๋ค์ ๋ณด์ผ ๋ ์์ ํ ์ฌ๋ ๋๋ง์ ๊ฐ์ ํฉ๋๋ค.
Offscreen์ด๋ ๋ฌด์์ธ๊ฐ์?
Offscreen์ React ๊ตฌ์ฑ ์์๋ฅผ ์ํ ๋ฌด๋ ๋ค ๊ณต๊ฐ์ผ๋ก ์๊ฐํด๋ณด์ญ์์ค. ๊ตฌ์ฑ ์์๊ฐ "์คํ์คํฌ๋ฆฐ"์ผ๋ก ํ์๋๋ฉด React๋ ๋จ์ํ ์ด๋ฅผ ์จ๊ธฐ์ง ์์ต๋๋ค. ๋์ ๊ตฌ์ฑ ์์ ํธ๋ฆฌ๋ฅผ ํ์ฑ ์ํ๋ก ์ ์งํ๊ณ ์
๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ ์ํ์ ํจ๊ณผ๋ฅผ ์ ์งํ์ง๋ง, ๋ ๋ฎ์ ์ฐ์ ์์๋ก ์ํํฉ๋๋ค. ๊ฒฐ์ ์ ์ผ๋ก, ๊ตฌ์ฑ ์์๋ React์ ๋ด๋ถ ํธ๋ฆฌ์์ ์ธ๋ง์ดํธ๋์ง ์์ผ๋ฏ๋ก ์ ์ฒด ์ํ์ ๋ชจ๋ ๊ด๋ จ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ณด์กด๋ฉ๋๋ค.
๋ณต์กํ ๋ค์ค ํญ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ณ ๋ คํด ๋ด
์๋ค. ์ ํต์ ์ธ React์์๋ ํญ A์์ ํญ B๋ก ์ ํํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํญ A์ ๊ตฌ์ฑ ์์๊ฐ ์ธ๋ง์ดํธ๋๊ณ ํญ B์ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ดํธ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํญ A๋ก ๋ค์ ์ ํํ๋ฉด React๋ ์ ์ฒด ํธ๋ฆฌ์ ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํด์ผ ํ๋ฏ๋ก, ํนํ ๋ด์ฉ์ด ํ๋ถํ ํญ์ ๊ฒฝ์ฐ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ๋์ ๋๋ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. Offscreen์ ์ฌ์ฉํ๋ฉด ํญ A์ ๊ตฌ์ฑ ์์๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ง์ดํธ๋๊ณ ๋ ๋๋ง๋ ์ํ๋ฅผ ์ ์งํ์ฌ ๋ค์ ์ ํ๋ ๋ ์ฆ์ ํ์๋ ์ ์์ต๋๋ค.
"๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง ์์ง" ๊ฐ๋
"๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง ์์ง"์ด๋ผ๋ ์ฉ์ด๋ Offscreen์ ์ญํ ์ ์ ์ ํ๊ฒ ์ค๋ช
ํฉ๋๋ค. ์ด๋ Concurrent React์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ ํด ์๊ฐ ๋๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ๊ณ ์ฐ์ ์์ ์์
์ ์๋ฃํ์ ๋ ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์์ ๋ํ ๋ ๋๋ง ์์
์ ์ํํฉ๋๋ค. ์ด๋ ๋ณด์ด์ง ์๋ UI ์์์ ๋ํ ๋ ๋๋ง ์
๋ฐ์ดํธ๊ฐ ํ์ดํ, ์ ๋๋ฉ์ด์
๋๋ ์คํฌ๋กค๊ณผ ๊ฐ์ ์ค์ํ ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋ฐฉํดํ์ง ์๊ณ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ตฌ์ฑ ์์๊ฐ Offscreen์ผ ๋:
- React๋ ๋ด๋ถ ํํ์ ๊ณ์ ์กฐ์ ํ๊ณ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ด๋ฌํ ๊ตฌ์ฑ ์์ ๋ด์ ์ํ ์ ๋ฐ์ดํธ๊ฐ ์ฒ๋ฆฌ๋ฉ๋๋ค.
useEffectํ ์ ์์กด์ฑ๊ณผ React ์ค์ผ์ค๋ฌ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ฐ์ ์์ํํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ฌ์ ํ ์คํ๋ ์ ์์ต๋๋ค.- ์ด๋ฌํ ๊ตฌ์ฑ ์์์ ์ค์ DOM ๋ ธ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ฆฌ๋๊ฑฐ๋ ๊ฐ์ํ๋ ๋๊น์ง ์์ฑ๋์ง ์์ต๋๋ค. ์ด๋ ๋จ์ํ CSS๋ก ์จ๊ธฐ๋ ๊ฒ๊ณผ๋ ์ค์ํ ์ฐจ์ด์ ์ ๋๋ค.
๋ชฉํ๋ ์ด๋ฌํ ์จ๊ฒจ์ง UI ์ธ๊ทธ๋จผํธ๋ฅผ "๋ฐ๋ปํ๊ฒ" ์ ์งํ๊ณ ์์ ํ ๊ธฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์ฌ์ฉ์๊ฐ ์ํธ์์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ ๋, ๋ก๋ฉ ์คํผ๋๋ ์ฝํ ์ธ ๊น๋ฐ์ ์์ด ์์ ํ ๋ก๋๋๊ณ ์ํธ์์ฉํ ์ ์๋ ์ํ๋ก ์ฆ์ ํ๋ฉด์ ํ์๋ ์ ์๋๋ก ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋คํธ์ํฌ ์ง์ฐ์ด๋ ์ฅ์น ์ฑ๋ฅ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํ๋ฉฐ, ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ํ๋ฆฌ๋ฏธ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ Offscreen์ ์ฃผ์ ์ด์
experimental_Offscreen์ด ์์ ํ๋์์ ๋ ์ฑํํ ๊ฒฝ์ฐ์ ์ด์ ์ ๋ค์ํ๋ฉฐ ์ผ๋ฐ์ ์ธ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ง์ ์ ์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
- ํฅ์๋ ๋ฐ์์ฑ: ๊ฐ์ฅ ์ฆ๊ฐ์ ์ธ ์ด์ ์ ๋๋ค. ์ฌ์ฉ์๋ ๋ค๋ฅธ ๋ณด๊ธฐ ๋๋ ์ํ ๊ฐ์ ์ ํ์ด ์ฆ๊ฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฅด๊ณ ์ ๋์ ์ด๋ผ๊ณ ์ธ์ํฉ๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ๋ง์ดํธ๋๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์ผ๋ฏ๋ก, ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ๋งค์ฐ ์ค์ํ, ์ง๊ฐ์ ์ผ๋ก ๋ ๋ถ๋๋ฌ์ด UI๋ก ์ด์ด์ง๋๋ค.
-
์ํ ์ ์ง: ์ด๋ ํ๋๋ฅผ ๋ฐ๊พธ๋ ์์์
๋๋ค. ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ด๋ ์ธ๋ง์ดํ
๊ณผ ๋ฌ๋ฆฌ,
Offscreen์ ๊ตฌ์ฑ ์์๊ฐ ๋ณด์ด์ง ์์ ๋๋ ๋ณต์กํ ์์, ์คํฌ๋กค ์์น ๋๋ ๋์ ์ฝํ ์ธ ์ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. ์ด๋ ์ค๋ง์ค๋ฌ์ด ๋ฐ์ดํฐ ์์ค์ด๋ ์ฌ์ค์ ์ ์ ๊ฑฐํ์ฌ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ํฌ๊ฒ ํฅ์์ํค๊ณ ์ธ์ง ๋ถํ๋ฅผ ์ค์ ๋๋ค. -
์ค์ด๋ ์ ํ ๋ฐ ๊น๋ฐ์: ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฝํ
์ธ ๋ฅผ ์ค๋นํจ์ผ๋ก์จ
Offscreen์ ๊ตฌ์ฑ ์์๊ฐ ๊ฐ์๊ธฐ ๋ํ๋๊ฑฐ๋ ์ฌ๋ ๋๋ง๋ ๋ ๋ฐ์ํ๋ ์๊ฐ์ "๋ฒ๋ฒ ๊ฑฐ๋ฆผ(jank)"์ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ ๋ณดํธ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ, ๋์ฑ ์ธ๋ จ๋๊ณ ์ ๋ฌธ์ ์ธ ๋ฏธํ์ ๊ธฐ์ฌํฉ๋๋ค. -
์ต์ ํ๋ ๋ฆฌ์์ค ์ฌ์ฉ: ์จ๊ฒจ์ง ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ด ๋ฆฌ์์ค๋ฅผ ์ต์ ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์์ ์๋ ์์ง๋ง,
Offscreen์ ์ง๋ฅ์ ์ผ๋ก ์ด๋ฅผ ์ํํฉ๋๋ค. ๋ ๋๋ง ์์ ์ ๋ฎ์ ์ฐ์ ์์ ์๊ฐ์ผ๋ก ์คํ๋ก๋ํ์ฌ ์ค์ํ ์ํธ์์ฉ ์ค์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด ์ ๊ตํ ์ค์ผ์ค๋ง์ ๊ณ์ฐ ๋ฅ๋ ฅ์ด ํจ์จ์ ์ผ๋ก ํ ๋น๋๋๋ก ๋ณด์ฅํ๋ฉฐ, ํนํ ์ฑ๋ฅ์ด ๋ฎ์ ์ฅ์น๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ์ฌ์ฉ์์๊ฒ ์ ์ฉํฉ๋๋ค. -
ํฅ์๋ ์ฝ์ด ์น ๋ฐ์ดํ: ์ฝํ
์ธ ๋ฅผ ๋ ๋น ๋ฅด๊ณ ๋ถ๋๋ฝ๊ฒ ์ ๊ณตํจ์ผ๋ก์จ
Offscreen์ FID(First Input Delay) ๋ฐ CLS(Cumulative Layout Shift)์ ๊ฐ์ ์ฃผ์ ์ฑ๋ฅ ์งํ์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์ฌ๋ ฅ์ด ์์ต๋๋ค. ๋ ์ด์์ ๋ณํ๊ฐ ์ ๊ณ ๋ ๋น ๋ฅธ UI๋ ์์ฐ์ค๋ฝ๊ฒ ๋ ๋์ ์ ์๋ก ์ด์ด์ ธ ๊ฒ์ ์์ง ์์์ ์ ์ธ๊ณ์ ์ธ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ ํ์ง์ ํฅ์์ํต๋๋ค.
experimental_Offscreen์ ์ค์ฉ์ ์ธ ์ฌ์ฉ ์ฌ๋ก
experimental_Offscreen์ ๋ค์ฉ๋์ฑ์ ์๋ง์ ์ ํ๋ฆฌ์ผ์ด์
ํจํด์ ์ ์ฉ๋๋ฉฐ, ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ด ๋ถ์กฑํ ๊ณณ์์ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํฉ๋๋ค.
ํญ ์ธํฐํ์ด์ค ๋ฐ ์บ๋ฌ์ : ๊ณ ์ ์ ์ธ ์์
์ด๋ ํ๋ฆผ์์ด ๊ฐ์ฅ ์ง๊ด์ ์ด๊ณ ์ํฅ๋ ฅ ์๋ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค. "๊ฐ์", "๋ถ์", "์ค์ " ๋ฐ "๋ณด๊ณ ์"์ ๊ฐ์ ์ฌ๋ฌ ํญ์ด ์๋ ๋์๋ณด๋๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ๊ธฐ์กด ์ค์ ์์๋ ์ด๋ฌํ ํญ ์ฌ์ด๋ฅผ ์ ํํ ๋ ์ข ์ข ํ์ฌ ํญ์ ์ฝํ ์ธ ๋ฅผ ์ธ๋ง์ดํธํ๊ณ ์ ํญ์ ๋ง์ดํธํ๋ ์์ ์ด ํฌํจ๋ฉ๋๋ค. "๋ถ์" ํญ์ด ๋ณต์กํ ์ฐจํธ์ ํ ์ด๋ธ๋ก ์ธํด ํนํ ๋ฐ์ดํฐ ์ง์ฝ์ ์ด๋ผ๋ฉด, "์ค์ "์ ๋ฐฉ๋ฌธํ ํ ๋ค์ ๋์์ฌ ๋ ์์ ํ ์ฌ๋ ๋๋ง๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ์ด๋ ๋ค์์ผ๋ก ์ด์ด์ง๋๋ค.
- ์ธ์๋ ์ง์ฐ: ์ฌ์ฉ์๋ ์งง์ง๋ง ๋์ ๋๋ ์ง์ฐ์ ๊ฒฝํํฉ๋๋ค.
- ์ํ ์์ค: ์ ์ฉ๋ ํํฐ, ์คํฌ๋กค ์์น ๋๋ ์ ์ฅ๋์ง ์์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฌ์ค์ ๋ ์ ์์ต๋๋ค.
Offscreen์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ํญ์ด React ํธ๋ฆฌ ๋ด์ ๋ง์ดํธ๋ ์ํ๋ก ์ ์ง๋๋ฉฐ, ํ์ฑ ํญ๋ง ์ค์ ๋ก ํ์๋ฉ๋๋ค. ๋นํ์ฑ ํญ์ ์คํ์คํฌ๋ฆฐ์์ ๋ ๋๋ง๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋นํ์ฑ ํญ์ ํด๋ฆญํ๋ฉด ํด๋น ์ฝํ
์ธ ๋ ์ด๋ฏธ ์ค๋น๋์ด ์๊ณ ์ํ๊ฐ ๋ณด์กด๋์ด ์ฆ์ ํ๋ฉด์ ๋ํ๋ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ดํฐ๋ธ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ ์ฌํ ๋งค์ฐ ๋ฐ์์ ์ด๊ณ ์ ๋์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ญ๋๋ค.
๊ฐ๋ ์ ์ฝ๋ ์์ (๊ฐ์ํ):
function TabbedInterface() {
const [activeTab, setActiveTab] = React.useState('Overview');
return (
<div>
<nav>
<button onClick={() => setActiveTab('Overview')}>Overview</button>
<button onClick={() => setActiveTab('Analytics')}>Analytics</button>
<button onClick={() => setActiveTab('Settings')}>Settings</button>
</nav>
<React.Offscreen isOffscreen={activeTab !== 'Overview'}>
<OverviewTab />
</React.Offscreen>
<React.Offscreen isOffscreen={activeTab !== 'Analytics'}>
<AnalyticsTab />
</React.Offscreen>
<React.Offscreen isOffscreen={activeTab !== 'Settings'}>
<SettingsTab />
</React.Offscreen>
</div>
);
}
์ด ์์์์ OverviewTab, AnalyticsTab, SettingsTab์ ๋ชจ๋ React ํธ๋ฆฌ ๋ด์ ๋ง์ดํธ๋ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. isOffscreen์ด false์ธ ๊ตฌ์ฑ ์์๋ง DOM์ ์ฐ๊ฒฐ๋๊ณ ์์ ํ ์ํธ์์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ค์ experimental_Offscreen์ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ์ฑ ์ํ๋ก ์ ์ง๋๊ณ ๋ ๋๋ง๋ฉ๋๋ค.
๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ ๋ฐ ์ค๋ฒ๋ ์ด: ์ฆ์ ํ์๋ฅผ ์ํ ์ฌ์ ๋ ๋๋ง
๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ณต์กํ ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ ๊ตํ ๊ฒฐ์ ์์, ๋ค๋จ๊ณ ์ฌ์ฉ์ ์จ๋ณด๋ฉ ํ๋ฆ ๋๋ ์์ธํ ํญ๋ชฉ ๊ตฌ์ฑ ํจ๋๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๋๋ค. ์ด๋ฌํ ๋ค์ด์ผ๋ก๊ทธ๋ ์ข ์ข ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ๋ง์ ๊ตฌ์ฑ ์์ ๋ ๋๋ง ๋ฐ ๋ํํ ์์ ์ค์ ๊ณผ ๊ด๋ จ๋ฉ๋๋ค. ์ ํต์ ์ผ๋ก ์ด๋ฌํ ๋ชจ๋ฌ์ ํ์ํด์ผ ํ ๋๋ง ๋ ๋๋ง๋ฉ๋๋ค.
Offscreen์ ์ฌ์ฉํ๋ฉด ๋ฌด๊ฑฐ์ด ๋ชจ๋ฌ์ ์ฝํ
์ธ ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ชจ๋ฌ์ ํธ๋ฆฌ๊ฑฐํ ๋(์: "์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ" ๋๋ "์ ํ ๊ตฌ์ฑ" ํด๋ฆญ) ๋ชจ๋ฌ ์์ฒด ๋ด๋ถ์ ๋ก๋ฉ ์คํผ๋ ์์ด ์์ ํ ์ฑ์์ง๊ณ ์ํธ์์ฉํ ์ ์๋ ์ํ๋ก ์ฆ์ ๋ํ๋ฉ๋๋ค. ์ด๋ ๊ฒฐ์ ๊ณผ์ ์์ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ด ์ดํ๋ฅ ์ ์ค์ด๊ณ ๊ธ๋ก๋ฒ ๊ณ ๊ฐ ๊ธฐ๋ฐ์ ์ํ ์ผํ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์๋ ์ ์์๊ฑฐ๋ ์ฌ์ดํธ์ ํนํ ์ ์ฉํฉ๋๋ค.
๋ณต์กํ ๋์๋ณด๋ ๋ฐ ๋ค์ค ๋ณด๊ธฐ ์ ํ๋ฆฌ์ผ์ด์
๊ธฐ์ ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๋ฐ์ดํฐ ํ๋ซํผ์ ์ฌ์ฉ์๊ฐ ๋ค์ํ ๋ฐ์ดํฐ ์๊ฐํ, ๋ณด๊ณ ์ ๋ ์ด์์ ๋๋ ์ฌ์ฉ์ ๊ด๋ฆฌ ๋ณด๊ธฐ ์ฌ์ด๋ฅผ ์ ํํ ์ ์๋ ๋์๋ณด๋๋ฅผ ์์ฃผ ํน์ง์ผ๋ก ํฉ๋๋ค. ์ด๋ฌํ ๋ณด๊ธฐ๋ ๋ํํ ์ฐจํธ, ํํฐ ์ค์ ๋ฐ ํ์ด์ง๊ฐ ๋งค๊ฒจ์ง ํ ์ด๋ธ์ ํฌํจํ์ฌ ์ํ๋ฅผ ๋ง์ด ๊ฐ์ง ์ ์์ต๋๋ค.
Offscreen์ ๋ชจ๋ ์ฃผ์ ๋์๋ณด๋ ๋ณด๊ธฐ๋ฅผ "๋ฐ๋ปํ๊ฒ" ์ ์งํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ํ๋งค ์ค์ ๋ณด๊ธฐ์์ ๊ณ ๊ฐ ์ฐธ์ฌ ๋ณด๊ธฐ๋ก, ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋์์ฌ ์ ์์ต๋๋ค. ๋ ๋ณด๊ธฐ๊ฐ ๋นํ์ฑ ์ํ์ผ ๋ ์คํ์คํฌ๋ฆฐ์ผ๋ก ์ ์ง๋๋ฉด ์ ํ์ด ์ฆ๊ฐ์ ์ด๋ฉฐ, ๋ชจ๋ ๋ํํ ์ํ(์: ์ ํ๋ ๋ ์ง ๋ฒ์, ์ ์ฉ๋ ํํฐ, ํ์ฅ๋ ์น์
)๊ฐ ์๋ฒฝํ๊ฒ ๋ณด์กด๋ฉ๋๋ค. ์ด๋ ๋ค๋ฅธ ๊ด์ ์์ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ํ์ํ๊ณ ๋น๊ตํด์ผ ํ๋ ์ ๋ฌธ๊ฐ์ ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
๊ฐ์ํ๋ ๋ชฉ๋ก (์ ํต์ ์ธ ๊ธฐ์ ์ด์)
react-window ๋๋ react-virtualized์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์๋๋ ๋ชฉ๋ก ํญ๋ชฉ๋ง ๋ ๋๋งํ์ง๋ง, ๋ช๋ช ์ธ์ ํ ์คํ์คํฌ๋ฆฐ ํญ๋ชฉ์ "๋ฐ๋ปํ๊ฒ" ์ ์งํ๋ฉด ๊ฒฝํ์ ๋์ฑ ํฅ์์ํฌ ์ ์๋ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌดํ ์คํฌ๋กค ๋ชฉ๋ก์์ ํ์๋๋ ๋ทฐํฌํธ ๋ฐ๋ก ๋ฐ๊นฅ์ ์๋ ํญ๋ชฉ์ Offscreen์ ์ํด ๋ ๋๋ง๋์ด ๋น ๋ฅธ ์คํฌ๋กค ์ค์ ๋น ๊ณต๊ฐ์ด ๋ณด์ด๋ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์์ผ๋ฉฐ, ํนํ ๋ ๋๋ง ๊ธฐ๋ฅ์ด ๋๋ฆฐ ์ฅ์น๋ ๋ณต์กํ ํญ๋ชฉ ๋ ์ด์์์ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค.
์คํ๋ผ์ธ ์ฐ์ ๋๋ PWA ์ํคํ ์ฒ
์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ์ฐ์ ์ํ๋ PWA(Progressive Web Applications)์ ๊ฒฝ์ฐ, Offscreen์ ์ฐ๊ฒฐ์ด ๊ฐํ์ ์ด๊ฑฐ๋ ์ฌ์ฉํ ์ ์์ ๋๋ ์ค์ํ UI ๊ตฌ์ฑ ์์๋ฅผ ์ค๋นํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ ์ ์์ต๋๋ค. ์์ฃผ ์ก์ธ์คํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ผ๋ถ๋ ์คํ์คํฌ๋ฆฐ ์ํ๋ก ์ ์ง๋์ด, ์ฌ์ฉ์์ ๋คํธ์ํฌ ํ๊ฒฝ์ ๊ด๊ณ์์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ฉด ๋ ๋น ๋ฅธ "๋ถํ
" ์๊ฐ๊ณผ ์ํํ ์ ํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
์ฌ์ธต ๋ถ์: Offscreen์ด Concurrent React์ ์ํธ์์ฉํ๋ ๋ฐฉ์
experimental_Offscreen์ ๊ฐ๋ ฅํจ์ Concurrent React์ ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ๋ถ์ ๊ด๊ณ์ ์์ต๋๋ค. ์ด๋ ๊ณ ๋ฆฝ๋์ด ์๋ํ๋ ๊ฒ์ด ์๋๋ผ React์ ์ ๊ตํ ์ค์ผ์ค๋ฌ๋ฅผ ํ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง ๋ง๋ฒ์ ์ํํฉ๋๋ค.
startTransition ๋ฐ useDeferredValue์ ์ญํ
์ด ๋ API๋ Concurrent React์์ ๋น์ฐจ๋จ ์
๋ฐ์ดํธ์ ํต์ฌ์ด๋ฉฐ, Offscreen์ ์ข
์ข
์ด๋ค๊ณผ ์๋์ง ํจ๊ณผ๋ฅผ ๋ด๋ฉฐ ์๋ํฉ๋๋ค. startTransition์ ์ฌ์ฉํ๋ฉด ํน์ ์ํ ์
๋ฐ์ดํธ๋ฅผ "์ ํ"์ผ๋ก ํ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ ๊ธด๊ธํ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ํด ์ค๋จ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. useDeferredValue๋ ๊ฐ์ ์
๋ฐ์ดํธ๋ฅผ ์ฐ๊ธฐํ์ฌ React์๊ฒ "๋ ์ค์ํ ์ผ์ด ์๊ธฐ๋ฉด ์ด ์
๋ฐ์ดํธ๋ ๊ธฐ๋ค๋ฆด ์ ์๋ค"๊ณ ํจ๊ณผ์ ์ผ๋ก ์๋ ค์ค๋๋ค.
์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์๊ฐ ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์ผ๋ฉด React์ ์ค์ผ์ค๋ฌ๋ ์ด๋ฅผ ๋ ๋ฎ์ ์ฐ์ ์์ ์์
์ผ๋ก ์ฒ๋ฆฌํ๊ณ , startTransition ๋ฐ useDeferredValue๋ฅผ ๊ตฌ๋ํ๋ ๊ฒ๊ณผ ๋์ผํ ์์น์ ์ฌ์ฉํ์ฌ ๋ ๋๋ง์ ์ ์ฌ์ ์ผ๋ก ์ฐ๊ธฐํ ์ ์์ต๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด์ด๋ UI๊ฐ ๋ฐ์์ฑ์ ์ ์งํ๋ ๋์์ ๋ฆฌ์์ค๊ฐ ํ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ์คํ์คํฌ๋ฆฐ ์ฝํ
์ธ ์
๋ฐ์ดํธ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
Suspense ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
Offscreen๊ณผ Suspense๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ Concurrent React ๋น์ ์ ์๋ฉด์
๋๋ค. Suspense๋ ๊ตฌ์ฑ ์์๊ฐ ๋ฐ์ดํฐ ๋๋ ๊ธฐํ ๋น๋๊ธฐ ๋ฆฌ์์ค๊ฐ ๋ก๋๋ ๋๊น์ง "๊ธฐ๋ค๋ฆฌ๋๋ก" ํ์ฉํ๋ฉฐ, ๊ทธ๋์ ๋์ฒด UI๋ฅผ ํ์ํฉ๋๋ค. ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์๊ฐ Suspense๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์์กดํ๋ ๊ฒฝ์ฐ, ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฝํ
์ธ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ ๋๋ง์ ์์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํด๋น ๊ตฌ์ฑ ์์๋ฅผ ํ์ฑํํ ๋์ฏค์ด๋ฉด ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ๋ก๋๋์๊ณ UI๊ฐ ์์ ํ ๋ ๋๋ง๋์ด ์ ํ์ด ์ฆ๊ฐ์ ์ด๋ฉฐ ๋ก๋ฉ ์ํ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ์ ์์กดํ๋ ๊ตฌ์ฑ ์์๊ฐ ํ์ํ ๋ ๋ฐ๋ก ์ค๋น๋๋ ์ง์ ์ผ๋ก ํตํฉ๋ ๋ก๋ฉ ๊ฒฝํ์ ๋ง๋ญ๋๋ค.
์ค์ผ์ค๋ง ๋ฐ ์ฐ์ ์์ ์ง์
React์ ์ค์ผ์ค๋ฌ๋ Offscreen์ ์ค์ผ์คํธ๋ ์ดํฐ์
๋๋ค. ์ด๋ ๋ ๋๋ง ์์
์ ์ฐ์ ์์๋ฅผ ์ง์์ ์ผ๋ก ํ๊ฐํฉ๋๋ค. ์ฌ์ฉ์ ์ํธ์์ฉ(์: ์
๋ ฅ ํ๋์ ํ์ดํ, ๋ฒํผ ํด๋ฆญ)์ ์ผ๋ฐ์ ์ผ๋ก ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋๋ค. ๋ณด์ด๋ ๊ตฌ์ฑ ์์์ ๋ํ ์
๋ฐ์ดํธ๋ ์ฐ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์์ ๋ํ ๋ ๋๋ง ์์
์ ๋ ๋ฎ์ ์ฐ์ ์์๊ฐ ํ ๋น๋ฉ๋๋ค. ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค.
- ๋ฉ์ธ ์ค๋ ๋๊ฐ ๊ณ ์ฐ์ ์์ ์์ ์ผ๋ก ๋ฐ์๋ฉด ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ์ผ์ ์ค์ง๋ฉ๋๋ค.
- ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ ํด ์ํ์ผ ๋ React๋ ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง ์์ ์ ์ํํฉ๋๋ค.
- ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณต์กํ ์์๋ฅผ ์ค๋นํ๋ ๋์์๋ ์ฌ์ฉ์๊ฐ ํญ์ ๋ฐ์์ ์ธ UI๋ฅผ ๊ฒฝํํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ด ์ง๋ฅ์ ์ธ ์ฐ์ ์์ ์ง์ ์ Offscreen์ด ์ ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ์ ๊ธฐ์ฌํ๋ ๋ฐฉ์, ํนํ ๋ค์ํ ๊ณ์ฐ ๋ฅ๋ ฅ์ ๊ฐ์ง ์ฅ์น ์ฌ์ฉ์๋ฅผ ์ํด ์ ์ญ์ ์ผ๋ก ์ผ๊ด๋ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐ ๊ทผ๋ณธ์ ์
๋๋ค.
experimental_Offscreen ์ฌ์ฉ: ๊ตฌํ ์ธ๋ถ ์ฌํญ
์์ง ์คํ ๋จ๊ณ์ด์ง๋ง, ์์๋๋ API์ ๊ทธ ์๋ฏธ๋ฅผ ์ดํดํ๋ ๊ฒ์ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค๋ฅผ ์ค๋นํ๋ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
Offscreen ๊ตฌ์ฑ ์์ API
experimental_Offscreen ๊ธฐ๋ฅ์ ํต์ฌ์ <Suspense>์ ์ ์ฌํ ๊ตฌ์ฑ ์์๊ฐ ๋ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ์๋ง๋ isOffscreen๊ณผ ๊ฐ์ prop์ ๋ฐ์ ๋์์ ์ ์ดํ ๊ฒ์
๋๋ค.
<React.Offscreen isOffscreen={true|false}>
<MyHeavyComponent />
</React.Offscreen>
isOffscreen์ดtrue์ผ ๋: ์์ ๊ตฌ์ฑ ์์(<MyHeavyComponent />)๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ ๋๋ง๋ฉ๋๋ค. ํด๋น DOM ๋ ธ๋๋ ๋ณด์ด๋ ๋ฌธ์์ ์ฐ๊ฒฐ๋์ง ์๊ฑฐ๋(๋๋ ๋ถ๋ฆฌ๋จ) ๋ถ๋ฆฌ๋ฉ๋๋ค. ์ํ ๋ฐ ๋ด๋ถ React ํธ๋ฆฌ๋ ๋ณด์กด๋ฉ๋๋ค.isOffscreen์ดfalse์ผ ๋: ์์ ๊ตฌ์ฑ ์์๋ ์์ ํ ๋ณด์ด๊ณ ์ํธ์์ฉํ๋ฉฐ, ์ผ๋ฐ์ ์ธ React ๊ตฌ์ฑ ์์๋ก ์๋ํฉ๋๋ค.
์ด prop์ ํ ๊ธํ๋ ๊ธฐ๋ฅ์ ํญ ์ธํฐํ์ด์ค๋ ๋ชจ๋ฌ์์ ์ํํ ์ ํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Offscreen ์ฌ์ฉ ์ ๊ณ ๋ ค ์ฌํญ
Offscreen์ ์ฑํํ๋ฉด ๊ตฌ์ฑ ์์ ์๋ช
์ฃผ๊ธฐ ๋ฐ ์ฌ์ด๋ ์ดํํธ ๊ด๋ฆฌ์ ๋ํ ์๋ก์ด ๊ณ ๋ ค ์ฌํญ์ด ๋์
๋ฉ๋๋ค.
-
์ฌ์ด๋ ์ดํํธ (`useEffect`, `useLayoutEffect`):
- ๋ชจ๋ DOM ๋ณ๊ฒฝ ํ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋
useLayoutEffect๋ ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์๊ฐ ๋ณด์ด๋ ์ํ๋ก ์ ํ๋ ๋(isOffscreen์ดfalse๊ฐ ๋ ๋)๋ง ์คํ๋ ๊ฒ์ ๋๋ค. ๋ ์ด์์ ํจ๊ณผ๋ ๋ณด์ด๋ DOM๊ณผ ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก ์ด๋ ํฉ๋ฆฌ์ ์ ๋๋ค. - ๋ฐ๋ฉด
useEffect๋ ๊ตฌ์ฑ ์์๊ฐ ์คํ์คํฌ๋ฆฐ์ผ ๋๋ ์คํ๋ ์ ์์ต๋๋ค. ์ด๋ ์ค์ํ ์ฐจ์ด์ ์ ๋๋ค.useEffect๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ๊ตฌ๋ ์ ์ค์ ํ๊ฑฐ๋, ๋ธ๋ผ์ฐ์ API์ ์ํธ์์ฉํ๋ ๊ฒฝ์ฐ, ์ด๋ฌํ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฌ์ ํ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์์ ๋ํด ์ด๋ค ์ฌ์ด๋ ์ดํํธ๊ฐ ์ ์ ํ์ง ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ ์ํ์ง๋ง, ์ ๋๋ฉ์ด์ ์ด๋ ๋ณด์ด์ง ์๋ ๋ฆฌ์์ค ์ง์ฝ์ ์ธ DOM ์กฐ์์ ์ํ์ง ์์ ์ ์์ต๋๋ค.
- ๋ชจ๋ DOM ๋ณ๊ฒฝ ํ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋
- ์ปจํ ์คํธ: ์ปจํ ์คํธ ์ ๋ฐ์ดํธ๋ ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์์๋ ๊ณ์ ์ ํ๋ฉ๋๋ค. ์ด๋ ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์๊ฐ ์ ์ญ ์ํ ๋ณ๊ฒฝ์ ๊ณ์ ๋ฐ์ํ ์ ์์์ ์๋ฏธํ๋ฉฐ, ๋ด๋ถ ์ํ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋๊ธฐํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
-
์ฑ๋ฅ ์ ์ถฉ:
Offscreen์ด ์ฑ๋ฅ ํฅ์์ ๋ชฉํ๋ก ํ์ง๋ง, ๋ง๋ฅ ํด๊ฒฐ์ฑ ์ ์๋๋๋ค. ๋ง์ ๋ณต์กํ ๊ตฌ์ฑ ์์๋ฅผ ์คํ์คํฌ๋ฆฐ์ผ๋ก ์ ์งํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ดํด์ ์๋ชจํ์ง๋ง, ๋ ๋ฎ์ ์ฐ์ ์์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๊ฐ๋ฐ์๋ ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์์ ๊ณผ๋ํ ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ ๋๋ ์ ๋ฐ์ ์ธ ์์คํ ๋ฐ์์ฑ์ ์ฌ์ ํ ์ํฅ์ ๋ฏธ์น๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ๋ก ์ด์ด์ง๋ ์๋๋ฆฌ์ค๋ฅผ ํผํ๊ธฐ ์ํด ํ๋จ๋ ฅ์ ๋ฐํํด์ผ ํฉ๋๋ค. ํ๋กํ์ผ๋ง์ ์ฌ์ ํ ์ค์ํฉ๋๋ค. - ๋๋ฒ๊น : ๋ ๋๋ง๋์ง๋ง ๋ณด์ด์ง ์๋ ๊ตฌ์ฑ ์์๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์๋ก์ด ๋์ ๊ณผ์ ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๊ธฐ์กด DOM ๊ฒ์ฌ๊ธฐ๋ ๋ณด์ด๋ DOM์ ์ฐ๊ฒฐ๋์ง ์์ ์์๋ฅผ ํ์ํ์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์์ ๊ตฌ์ฑ ์์ ํธ๋ฆฌ, ์ํ ๋ฐ props๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํด React DevTools์ ๋ ๋ง์ด ์์กดํด์ผ ํ ๊ฒ์ ๋๋ค. React ํ์ ์ด๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ๊ฐํํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ฝ๋ ์์: Offscreen์ผ๋ก ํญ ์ธํฐํ์ด์ค ๊ตฌํํ๊ธฐ (๋ ์์ธํ)
์ด์ ์ ๊ฐ๋ ์ ์์๋ฅผ ํ์ฅํ์ฌ ์ผ๋ฐ์ ์ธ ํจํด์ ์ค๋ช ํด ๋ด ์๋ค.
import React, { useState, useDeferredValue, Suspense } from 'react';
// Imagine these are heavy, data-fetching components
const OverviewContent = React.lazy(() => import('./OverviewContent'));
const AnalyticsContent = React.lazy(() => import('./AnalyticsContent'));
const SettingsContent = React.lazy(() => import('./SettingsContent'));
// A basic Tab component for illustration
const Tab = ({ label, isActive, onClick }) => (
<button
style={{
padding: '10px 15px',
margin: '0 5px',
border: isActive ? '2px solid blue' : '1px solid gray',
backgroundColor: isActive ? '#e0f7fa' : '#f0f0f0',
cursor: 'pointer',
}}
onClick={onClick}
>
{label}
</button>
);
function AppTabs() {
const [activeTab, setActiveTab] = useState('overview');
// Optional: Defer the activeTab state to allow React to prioritize UI responsiveness
const deferredActiveTab = useDeferredValue(activeTab);
return (
<div style={{ fontFamily: 'Arial, sans-serif', padding: '20px' }}>
<h1>Global Dashboard with Offscreen Tabs</h1>
<nav style={{ marginBottom: '20px' }}>
<Tab label="Overview" isActive={activeTab === 'overview'} onClick={() => setActiveTab('overview')} />
<Tab label="Analytics" isActive={activeTab === 'analytics'} onClick={() => setActiveTab('analytics')} />
<Tab label="Settings" isActive={activeTab === 'settings'} onClick={() => setActiveTab('settings')} />
</nav>
<div style={{ border: '1px solid #ccc', padding: '20px', minHeight: '300px' }}>
{/* Each tab panel is wrapped in React.Offscreen */}
<React.Offscreen isOffscreen={deferredActiveTab !== 'overview'}>
<Suspense fallback={<p>Loading Overview...</p>}>
<OverviewContent />
</Suspense>
</React.Offscreen>
<React.Offscreen isOffscreen={deferredActiveTab !== 'analytics'}>
<Suspense fallback={<p>Loading Analytics...</p>}>
<AnalyticsContent />
</Suspense>
</React.Offscreen>
<React.Offscreen isOffscreen={deferredActiveTab !== 'settings'}>
<Suspense fallback={<p>Loading Settings...</p>}>
<SettingsContent />
</Suspense>
</React.Offscreen>
</div>
</div>
);
}
export default AppTabs;
์ด ๋ ํ์ค์ ์ธ ์์์์๋ React.lazy์ Suspense๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ๊ตฌ์ฑ ์์๋ฅผ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค. useDeferredValue ํ
์ ํญ ์ ํ(activeTab ์ํ ์
๋ฐ์ดํธ)์ด ๋ฎ์ ์ฐ์ ์์ ์ ํ์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ํ์ฌ, ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ ํ ๋ ๋๋ง ์ค์ด๋๋ผ๋ UI๊ฐ ๋ฐ์์ฑ์ ์ ์งํ๋๋ก ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํญ์ ํด๋ฆญํ๋ฉด ํด๋น ํญ ์ฝํ
์ธ ์ `isOffscreen` prop์ด `false`๊ฐ ๋๋ฉฐ, ์ด๋ฏธ ์คํ์คํฌ๋ฆฐ์์ ๋ ๋๋ง๋์๊ธฐ(๋๋ ๋ ๋๋ง ์ค๋น๋์๊ธฐ) ๋๋ฌธ์ ๊ฑฐ์ ์ฆ์ DOM์ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ์กฐํฉ์ ์ฌ์ฉ์ ๊ฒฝํ ๊ด๋ฆฌ์์ ์๋นํ ์ง์ ์ ๋ํ๋
๋๋ค.
"์คํ์ "์ด๋ผ๋ ๋ ์ด๋ธ: ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ ์ด๋ค ์๋ฏธ์ธ๊ฐ
experimental_Offscreen์ด ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์คํ์ ๊ธฐ๋ฅ์์ ๋ค์ ํ๋ฒ ๊ฐ์กฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ๋ช
์นญ์ ํ์ฌ ์ฌ์ฉ ๋ฐ ๋ฏธ๋ ๊ฐ๋ฐ์ ์ค์ํ ์๋ฏธ๋ฅผ ๋ดํฌํฉ๋๋ค.
-
์งํํ๋ API:
Offscreen์ API๋ ์์ง ์์ ์ ์ด์ง ์์ต๋๋ค. React ํ๊ณผ ๋ ๋์ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ํผ๋๋ฐฑ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ด๋ ์ค๋experimental_Offscreen์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์ฝ๋๊ฐ ํฅํ React ๋ฒ์ ์์ ์กฐ์ ์ด ํ์ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. - ์์ง์ ํ๋ก๋์ ์ฌ์ฉ ๋ถ๊ฐ: ๋๋ถ๋ถ์ ํ๋ก๋์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ ์ฌ์ ์ธ ํธํ์ฑ ๋ฌธ์ ์ ์ฅ๊ธฐ์ ์ธ ์์ ์ฑ ๋ณด์ฅ์ ๋ถ์กฑ์ผ๋ก ์ธํด ์คํ์ ๊ธฐ๋ฅ์ ์์กดํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅํ์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ค์ํ ์์คํ ์ ํตํฉํ๊ธฐ ์ ์ ์ฃผ์์ ์ฒ ์ ํ ํ๊ฐ๋ฅผ ํด์ผ ํฉ๋๋ค.
-
์ปค๋ฎค๋ํฐ ์ฐธ์ฌ: ์คํ ๋จ๊ณ๋ ํผ๋๋ฐฑ์ ์์งํ๋ ๋ฐ ์ค์ํ ๊ธฐ๊ฐ์
๋๋ค. React ํ์ ๊ฐ๋ฐ์๋ค์ด ํ๋กํ ํ์
, ๊ฐ์ธ ํ๋ก์ ํธ ๋ฐ ์ค์ํ์ง ์์ ํ๊ฒฝ์์
Offscreen์ ์คํํ์ฌ ๋์์ ์ดํดํ๊ณ , ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ฉฐ, ๊ณต์ React ์ฑ๋์ ํ ๋ก ์ ํตํด ๋์์ธ์ ๊ธฐ์ฌํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ ์ธ๊ณ ๋ค์ํ ๋ฐฐ๊ฒฝ๊ณผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ์ง ๊ฐ๋ฐ์๋ค์ ์ฐธ์ฌ๋ฅผ ํฌํจํ๋ ์ด๋ฌํ ํ๋ ฅ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ด ๊ธฐ๋ฅ์ด ๊ฒฌ๊ณ ํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๋๊ตฌ๋ก ๋ฐ์ ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. -
์ฅ๊ธฐ ๋น์ :
experimental_Offscreen์ ์กด์ฌ๋ React๊ฐ ๊ณ ์ฑ๋ฅ, ๋ฐ์์ฑ ๋ฐ ์ฆ๊ฑฐ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํ ์ฅ๊ธฐ์ ์ธ ์ฝ์์ ๋ํ๋ ๋๋ค. ์ด๋ ๋ ๋๋ง ์ฐ์ ์์ ๋ฐ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋ํ ์ ๋ก ์๋ ์ ์ด๋ฅผ ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ React ๋์์ฑ ๋ ๋๋ง ์ ๋ต์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์์ ๋๋ค. ๊ฒฐ๊ตญ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ์ค์ํ ์ด์ ํ๊ฐ ๋ ๊ฒ์ ๋๋ค.
Offscreen์ ๋์ ๊ณผ์ ๋ฐ ๋ฏธ๋ ๋ฐฉํฅ
์ ์ฌ์ ์ธ ์ด์ ์ ์์ฒญ๋์ง๋ง, ์์ ์ ์ด๊ณ ๋๋ฆฌ ์ฑํ๋ Offscreen์ผ๋ก ๊ฐ๋ ๊ธธ์ ๋ช ๊ฐ์ง ๋์ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ฏธ๋ ๋ฐฉํฅ์ ํ์ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ์ฌ๋ฌ ๋ณต์กํ ๊ตฌ์ฑ ์์๋ฅผ ์คํ์คํฌ๋ฆฐ ์ํ๋ก ํ์ฑํํ๋ฉด ์ธ๋ง์ดํ ํ๋ ๊ฒ๋ณด๋ค ํ์ฐ์ ์ผ๋ก ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํฉ๋๋ค. ์ ์ฌ์ ์ธ ๋ทฐ์ ์๊ฐ ๋งค์ฐ ๋ง๊ฑฐ๋ ๋งค์ฐ ๋ฌด๊ฑฐ์ด ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ํนํ ์ ์ฌ์ ์ฅ์น ๋๋ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ค๋ซ๋์ ์ก์ธ์ค๋์ง ์์ ์คํ์คํฌ๋ฆฐ ํธ๋ฆฌ๋ฅผ ์ง๋ฅ์ ์ผ๋ก ์ ๋ฆฌํ๊ฑฐ๋ ์ผ์ ์ค๋จํ๋ ์ ๋ต์ด ํ์ํ ์ ์์ต๋๋ค.
-
๊ฐ๋ฐ์ ๋ณต์ก์ฑ ์ฆ๊ฐ:
Offscreen์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋จ์ํํ์ง๋ง, ๊ฐ๋ฐ์์๊ฒ๋ ์๋ก์ด ์ ์ ๋ชจ๋ธ์ ๋์ ํฉ๋๋ค. ์ฌ์ด๋ ์ดํํธ๊ฐ ์ธ์ ์คํ๋๋์ง, ์ปจํ ์คํธ๊ฐ ์ด๋ป๊ฒ ์ ํ๋๋์ง, React ์ค์ผ์ค๋ฌ์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด ๋์ฑ ์ค์ํด์ง๋๋ค. ์ ์ธ๊ณ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ํ์ต ๊ณก์ ์ ์ํํ๊ธฐ ์ํด์๋ ๋ช ํํ ๋ฌธ์, ๊ฐ๋ ฅํ ์์ ๋ฐ ํฅ์๋ ๊ฐ๋ฐ์ ๋๊ตฌ๊ฐ ํ์์ ์ ๋๋ค. - ํ์คํ ๋ฐ ์ํธ ์ด์ฉ์ฑ: ์คํ์ ๊ธฐ๋ฅ์ผ๋ก์, ์์ ์ ์ธ API๋ ๊ธฐ์กด React ํจํด, ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ) ๋ฐ ๋ ์ค๋ฅด๋ ์น ํ์ค๊ณผ ์ํํ๊ฒ ํตํฉ๋๋๋ก ์ ์คํ๊ฒ ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. ๊ด๋ฒ์ํ ์ฑํ์ ์ํด์๋ ์ํ๊ณ ์ ๋ฐ์ ์ผ๊ด์ฑ์ด ์ค์ํฉ๋๋ค.
-
์ถ๊ฐ ์ต์ ํ: React ํ์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ๊ณผ์ ๋ ๊น์ ํตํฉ์ ๊ณ์ ํ์ํ๊ณ ์์ต๋๋ค.
Offscreen์ด ๊ถ๊ทน์ ์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง ๋๋ ์ฌ์ ๋ ๋๋ง์ ์ํ ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ๋ฉ์ปค๋์ฆ์ ๋ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์์๊น์? ์๋ฅผ ๋ค์ด, Web Workers์์ ๊ต์ฐจ์ ์ ๋ฉ์ธ ์ค๋ ๋์์ ๋ ๋ง์ ์์ ์ ์คํ๋ก๋ํ์ฌ ํจ์ฌ ๋ ํฐ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
Offscreen์ ์์ฉํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก (์์ ํ ์)
experimental_Offscreen์ด ์์ ์ ์ธ ๊ธฐ๋ฅ์ผ๋ก ์ฑ์ํด์ง๋ฉด, ๊ทธ ์ด์ ์ ๊ทน๋ํํ๊ณ ์ ์ฌ์ ์ธ ํจ์ ์ ํผํ๊ธฐ ์ํด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
-
์๊ฒ ์์ํ๊ณ ์ค์ํ ๊ฒฝ๋ก ์๋ณ: ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ํ ๋ฒ์ ๋ฆฌํฉํ ๋งํ์ง ๋ง์ญ์์ค. ์ฌ๋ ๋๋ง ์ง์ฐ์ผ๋ก ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฐ๋ ์ฃผ์ ์ฌ์ฉ์ ํ๋ฆ ๋๋ ๊ตฌ์ฑ ์์(์: ๋ณต์กํ ํญ ์ธํฐํ์ด์ค, ๊ณ ํ์ง ๋ชจ๋ฌ)๋ฅผ ๋จผ์ ์๋ณํ๊ณ
Offscreen์ ๊ฑฐ๊ธฐ์ ์ ์ฉํ์ญ์์ค. -
์๊ฒฉํ ํ๋กํ์ผ๋ง: ํญ์ ์ค์ ์ฑ๋ฅ ํฅ์์ ์ธก์ ํ์ญ์์ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ ๋ฐ React DevTools ํ๋กํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ
Offscreen์ด ์ค์ ๋ก ์ธ์ง๋ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์์ผ๋ฉฐ, ์์ํ๋ ์ด์ ์์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋๋ CPU ์ฌ์ดํด์ ๋ถ์ฃผ์ํ๊ฒ ์ฆ๊ฐ์ํค์ง ์๋์ง ํ์ธํ์ญ์์ค. -
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ ์: ์คํ์คํฌ๋ฆฐ์ผ๋ก ์ ์งํ ๊ตฌ์ฑ ์์๋ฅผ ์ ์คํ๊ฒ ์ ํํ์ญ์์ค. ๋ช๋ช๋ง ์ก์ธ์ค๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ ์๋ฐฑ ๊ฐ์ ๋ณต์กํ ๊ตฌ์ฑ ์์๋ฅผ ์คํ์คํฌ๋ฆฐ์ผ๋ก ๋ ๋๋งํ์ง ๋ง์ญ์์ค. ์ฌ์ฉ์ ํ๋์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ํ์ ๋ฐ๋ผ
isOffscreenprop์ ์ง์ฐ ๋ก๋ํ๊ฑฐ๋ ๋์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ ๋ต์ ๊ณ ๋ คํ์ญ์์ค. -
ํ ๊ต์ก:
Offscreen๊ณผ ๊ฐ์ ๋์์ฑ ๊ธฐ๋ฅ์ผ๋ก ์ธํด ๋์ ๋๋ ํจ๋ฌ๋ค์ ๋ณํ๋ React ๋ด๋ถ ์๋ ๋ฐฉ์์ ๋ํ ๋ ๊น์ ์ดํด๋ฅผ ์๊ตฌํฉ๋๋ค. ๋ชจ๋ ์ฌ๋์ด ํจ๊ณผ์ ์ด๊ณ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋๋ก ํ ๊ต์ก ๋ฐ ์ง์ ๊ณต์ ์ ํฌ์ํ์ญ์์ค. -
React ๊ฐ๋ฐ ์
๋ฐ์ดํธ ์ง์: React ํ์ ๊ฐ๋ฐ ๊ณผ์ ์ ๋ํด ๋งค์ฐ ํฌ๋ช
ํฉ๋๋ค. ๊ณต์ React ๋ธ๋ก๊ทธ, GitHub ํ ๋ก ๋ฐ ๋ฆด๋ฆฌ์ค ๋
ธํธ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์ฐธ์กฐํ์ฌ
Offscreen๋ฐ ๊ธฐํ ๋์์ฑ ๊ธฐ๋ฅ์ ๋ํ API ๋ณ๊ฒฝ ์ฌํญ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์๋ก์ด ํต์ฐฐ๋ ฅ์ ํ์ธํ์ญ์์ค. -
์ฌ์ด๋ ์ดํํธ ์ ์คํ๊ฒ ์ฒ๋ฆฌ: ์คํ์คํฌ๋ฆฐ ๊ตฌ์ฑ ์์์ ๋ํด ์ด๋ค ์ฌ์ด๋ ์ดํํธ๊ฐ ์คํ๋์ด์ผ ํ๋์ง ๋ช
ํํ ํ์ญ์์ค.
useEffect์ ์ ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋๋ ์์น ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ๋ฐฉ์งํ์ญ์์ค. ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง ๋์์ ๊ณ ๋ คํ๋ ์ฌ์ฉ์ ์ ์ ํ ๋๋ ์ํ ๊ด๋ฆฌ ํจํด์ ๊ณ ๋ คํ์ญ์์ค.
๊ฒฐ๋ก : ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฏธ๋๋ฅผ ์ฟ๋ณด๋ค
React์ experimental_Offscreen ๋ ๋๋ฌ๋ ์ง์ ์ผ๋ก ๋ฐ์์ ์ด๊ณ ๊ณ ์ฑ๋ฅ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ์์ด ๊ธฐ๋
๋น์ ์ธ ์ง์ ์ ๋ํ๋
๋๋ค. ๊ตฌ์ฑ ์์์ ์ํํ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง๊ณผ ์ํ ์ ์ง๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ์ผ๋ก์จ, ๊ฐ๋ฐ์์๊ฒ ๋ฒ๋ฒ
๊ฑฐ๋ฆผ(jank)์ ์ ๊ฑฐํ๊ณ , ์๋์ ๋ํ ์ฌ์ฉ์ ์ธ์์ ํฅ์์ํค๋ฉฐ, ์ ์ธ๊ณ ๋ค์ํ ์ฅ์น ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ๊ณ ๋๋ก ์ธ๋ จ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ง ์คํ ๋จ๊ณ์ด์ง๋ง, Offscreen์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์์ง๋์ด๋ง์ ์ฐ์์ฑ์ ํฅํ React์ ์ง์์ ์ธ ์ถ๊ตฌ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๋ ์ ํต์ ์ธ ๋ ๋๋ง ํจ๋ฌ๋ค์์ ๋์ ํ๊ณ ์น์ด ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๋์ฑ๊ณผ ์ง์ ์ผ๋ก ๊ฒฝ์ํ ์ ์๋ ์๋๋ฅผ ์ด์ด์ค๋๋ค. React ํ์ด ์ด ๊ฐ๋ ฅํ ์์ง์ ๊ฐ์ ํ๊ณ ์ ์ธ๊ณ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ๊ฐ ๊ทธ ๊ธฐ๋ฅ์ ์ฐธ์ฌํจ์ ๋ฐ๋ผ, ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ํธ์์ฉ์ด ์ฆ๊ฐ์ ์ด๊ณ , ๋ชจ๋ ์ ํ์ด ์ํํ๋ฉฐ, ์์น๋ ์ฅ์น์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋นํ ๋ฐ ์๋ ์น ๊ฒฝํ์ ์ฆ๊ธฐ๋ ๋ฏธ๋์ ๋ ๊ฐ๊น์์ง๊ณ ์์ต๋๋ค. React์ ๋ณด์ด์ง ์๋ ๊ฐ์๊ฐ ์๋ํ๋ฉฐ, ํ ๋ฒ์ ํ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ ๋๋ง์ผ๋ก ๋์งํธ ์ธํฐํ์ด์ค๋ฅผ ์ธ์ํ๊ณ ์ํธ์์ฉํ๋ ๋ฐฉ์์ ์กฐ์ฉํ ํ์ ํ๊ณ ์์ต๋๋ค.